# Python CookBook.pdf
## 第一章:数据结构与算法
### 1.5 实现一个优先级队列
import heapq


class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        '''向队列中加入元组，排序顺序是按照-priority来的，因为heapq是一个最小堆，就是从小到到达排序，所以优先级需要取负，存入的是一个元组数据'''
        heapq.heappush(self._queue, (-priority, self._index, item))

    def pop(self):
        '''获取元组中最后一个数值'''
        return heapq.heappop(self._queue)[-1]


class Item:
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return "Item({!r})".format(self.name)

q = PriorityQueue()
q.push(Item("foo"), 2)
q.push(Item("bar"), 5)
q.push(Item("xyz"), 3)
q.push(Item("word"), 6)

print(q.pop())
print(q.pop())
print(q.pop())
print(q.pop())
'''
结果
Item('word')
Item('bar')
Item('xyz')
Item('foo')
'''

### 1.6 字典中映射多个值
# list
d = {
    'a': [1, 2, 3],
    'b': [2, 3, 4]
}

# set集合
y = {
    'a': {1, 2, 3},
    'b': {2, 3, 4}
}
# 使用collections 轻松创建具有多个值得dict

from collections import defaultdict

d = defaultdict(list) # list有序
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)
d['b'].append(3)

y = defaultdict(set)  # set无序不重复
y['b'].add(1)
y['b'].add(3)
y['b'].add(3)
y['c'].add(2)

print(d)
print(y)
'''
defaultdict(<class 'list'>, {'a': [1, 2], 'b': [3, 3]})
defaultdict(<class 'set'>, {'b': {1, 3}, 'c': {2}})
'''
